﻿using System;
using System.Diagnostics;
using System.Linq;
using System.Security.Principal;
using System.Windows.Forms;
using Microsoft.Deployment.WindowsInstaller;

namespace CustomAction
{
    /// <summary>
    /// Набор вспомогательных методов.
    /// </summary>
    public static class Utils
    {
        /// <summary>
        /// Производит поиск дескриптора окна установки по заголовку.
        /// </summary>
        /// <param name="productName">Имя продукта.</param>
        /// <returns>Возвращает окно, если оно найдено, иначе - null.</returns>
        public static WindowWrapper GetWixWindowHandle(string productName)
        {
            IntPtr[] handles = GetHandlesThisProject(productName);

            if (handles.Length == 1)
            {
                return new WindowWrapper(handles[0]);
            }
            else if (handles.Length > 1)
            {
                throw new InstallerException("Запущено больше одного установщика!");
            }
            else
            {
                return null;
            }
        }

        public static IntPtr[] GetHandlesThisProject(string productName)
        {
            return Process.GetProcessesByName("msiexec")
                .Where(process => process.MainWindowHandle != IntPtr.Zero)
                .Where(process => process.MainWindowTitle == "Установка " + productName)
                .Select(process => process.MainWindowHandle)
                .ToArray();
        }

        public static void ShowErrorBox(string text, IWin32Window owner = null)
        {
            MessageBox.Show(
                owner,
                text,
                "Ошибка",
                MessageBoxButtons.OK,
                MessageBoxIcon.Error);
        }

        /// <summary>
        /// Проверка наличия прав администратора.
        /// </summary>
        /// <returns>Возвращает true если приложение запущено от имени администратора, иначе false.</returns>
        public static bool IsAdmin()
        {
            return new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator) ? true : false;
        }            
    }
}
